package com.jxb.three;

/**
 * 给定一个非负整数数组nums ，你最初位于数组的第一个下标。
 * 数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。
 * 输入：nums = [2,3,1,1,4]
 * 输出：true
 * 输入：nums = [3,2,1,0,4]
 * 输出：false
 *
 * 思路：
 *  1：找出是否有0的元素
 *  2：若没有0的元素，可以直接到达最后一个下标
 *  3：若有0的元素，需要获取0元素之前的元素是否能够跳过0，不能跳过0，则不能到达最后一个下标
 */
public class JumpGame_55 {

    public static void main(String[] args) {
        int[] nums = {0,1};
        System.out.println(canJump(nums));
    }


    public static boolean canJump(int[] nums) {
        if (nums.length < 2) {
            return true;
        }
        //从倒数第二个元素开始找
        for (int cur = nums.length-2;cur>= 0;cur--) {
            if (nums[cur] == 0) {
                int jump = 1;
                while (jump > nums[cur]) {
                    jump++;
                    cur--;
                    if (cur < 0) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    //基于动态规划来解决
    //通过公式：maxStap = max(maxStap-1,nums[i])
    //dp公式：dp[i] = max(dp[i-1]-1,nums[i])
    //在循环中实现公式
    public boolean canJumpWithDP(int[] nums) {
        int n = nums.length;
        int maxStep = nums[0];//3
        //[3,2,1,0,4]
        for (int i = 1;i<n;i++) {
            if (maxStep==0) {
                return false;
            }
            //2->1
            maxStep = Math.max(maxStep-1,nums[i]);
        }
        return true;
    }


}
